#include "aientry.h"
#include<ctime>
#include<stdlib.h>
#define random(x) (rand()%x)

AIEntry::AIEntry(Player* p){
    ai=p;
}
void AIEntry::init(){
    qDebug()<<" 初始化AI角色成功";
}
void AIEntry::run(Player* p){
      ai->run();
      ifEvade(p);
}
int* AIEntry::getPlayerSite(Player *P1player){

}
//Player* AIEntry::newAIPlayer(Player *p){
//    ai=p;
//    return ai;
//}
PlayerStatus AIEntry::getStatus(Player* p){
    return p->getStatus();
}
///获取玩家相对方向
PlayerStatus AIEntry::getRelativePos(Player* aip,Player *p){
    if((p->getGraphics()->x())>(aip->getGraphics()->x())){
        return moveRight;
    }
    else if((p->getGraphics()->x())<(aip->getGraphics()->x()))
    {
        return moveLeft;
    }
}
bool AIEntry::judgeInstance(Player* p,float instance){
    //判断角色和人家的距离是否在合适位置
    float insx1=p->getGraphics()->x();
    float insy1=p->getGraphics()->y();
    float insx2=ai->getGraphics()->x();
    float insy2=ai->getGraphics()->y();
    if(fabs(insx1-insx2)<=instance){
        if(sqrt((insx1-insx2)*(insx1-insx2)+(insy1-insy2)*(insy1-insy2))<instance){
            return true;
        }
        else
            return false;
    }
    else
        return false;
}
void AIEntry::findAndDeci(Player* p){
    ///人物攻击的改变在这里,比如出拳频率
    //判断玩家角色和人机的距离是否在合适位置
    bool res=judgeInstance(p,CLOSE_INSTANCE);
//    qDebug()<<res<<endl;
    if(res){//在近距离
        //如果角色在人机的右边，则向右攻击
        if(moveRight==getRelativePos(ai,p)){
            ai->setActionFlag(true);
            ai->setStatus(attackRight);
            ai->setActionFlag(true);
        }else if(moveLeft==getRelativePos(ai,p)){
            ai->setActionFlag(true);
            ai->setStatus(attackLeft);
            ai->setActionFlag(true);
        }
    }else{//在远距离
        //如果角色在人机的右边，则向右靠近
        if(jumpingLeft==ai->getStatus()||jumpingRight==ai->getStatus()){
            ai->setActionFlag(false);
        }
        if(moveRight==getRelativePos(ai,p)){
            ai->setStatus(moveRight);

        }else if(moveLeft==getRelativePos(ai,p)){
            ai->setStatus(moveLeft);
//            qDebug()<<"人物状态"<<ai->getStatus()<<endl;
        }
    }
}

///判断相对方向，释放技能
void AIEntry::releRealativeSkill(Player* p){
    //人机攻击时间里放技能
    if(moveLeft==getRelativePos(ai,p)){
        ai->setActionFlag(true);
        ai->setStatus(combinationAttackLeft);
    }
    else if(moveRight==getRelativePos(ai,p)){
        ai->setActionFlag(true);
        ai->setStatus(combinationAttackRight);
    }
}
void AIEntry::ifEvade(Player* p){
    if(ai->getAttackedNum()==3){//受击次数等于3
        srand(time(0));
        int t=random(3);
        if(0==t){//任意跳或向着角色相反的地方走
            //获得获得的任意数为0，往角色相反的方向跳
            if(moveRight==getRelativePos(ai,p)){//角色在右边，向右走

                ai->setStatus(jumpLeft);
                 ai->setActionFlag(true);
            }
            else if(moveLeft==getRelativePos(ai,p)){

                ai->setStatus(jumpRight);
                 ai->setActionFlag(true);
          }
            ai->setAttackedNum();
        }
        else {//获得的任意数为1、2，往角色相反的方向走
            if(moveRight==getRelativePos(ai,p)){//角色在右边，向左走
                ai->setStatus(moveLeft);
                ai->setActionFlag(true);
            }
            else if(moveLeft==getRelativePos(ai,p)){//角色在左边，向右走
                ai->setStatus(moveRight);
                ai->setActionFlag(true);
            }
        }
        ai->setAttackedNum();
    }
    else{//受击次数小于3
        //需要让人机看起来自由移动，设置随机种子,在较少数值达到闲走的效果
        //多数值达到去攻击
        srand(time(0));
        t=random(8);
        //人机难度设置
        //用到随机数种子
        //难度划分根据:玩家人物积分
        //实现方法:在随机数一定的情况下,改变攻击和闪避的占比
        //划分区间:LOW_POINTS(0~80) 、MIDDLE_POINTS(81~200)、HIGH_POINTS(201~ ∞ )
        //原人机难度大致为躲避攻击各占一半，导致人机攻击频率和攻击有效次更多，较难取胜

        //现人机逻辑:
        //在LOW_POINTS(0~80)(低级区),躲避和攻击玩家指令占比为5:3         随机数(0、1、4、5、7)
        //在MIDDLE_POINTS(81~200)(中级区),躲避和攻击玩家指令占比为4:4   随机数(2、3、6、7)
        //在HIGH_POINTS(201~ ∞ )(高级区),躲避和攻击玩家指令占比为3:5     随机数(1、3、6)
        //人机积分区域数值待定(技能打击概率不定)
        if(p->getScore()<=LOW_POINTS){
            //积分在低级区
            if(0==t||1==t||4==t||5==t||7==t){
                if(moveRight==getRelativePos(ai,p)){//角色在右边，向左走
                    if(7==t)
                        ai->setStatus(defenseRight);
                    ai->setStatus(moveLeft);
                }
                else if(moveLeft==getRelativePos(ai,p)){//角色在右边，向左走
                    if(7==t)
                        ai->setStatus(defenseLeft);
                    ai->setStatus(moveRight);
                }
            }
            else{
                //判断角色和人家的距离是否在合适位置,移动或攻击
                findAndDeci(p);
                //施放技能
                res=judgeInstance(p,CLOSE_INSTANCE);
                if(6==t){
                    if(res){
                        releRealativeSkill(p);
                    }
                }
            }
        }
        else if(p->getScore()>LOW_POINTS&&p->getScore()<=MIDDLE_POINTS){
            //积分在中级区
            if(2==t||3==t||6==t||7==t){
                if(moveRight==getRelativePos(ai,p)){//角色在右边，向左走
                    //中级人机和高级人机在攻击时段放技能
                    if(2==t)
                        ai->setStatus(defenseRight);
                    ai->setStatus(moveLeft);
                }
                else if(moveLeft==getRelativePos(ai,p)){//角色在右边，向左走
                    if(2==t)
                        ai->setStatus(defenseLeft);
                    ai->setStatus(moveRight);
                }
            }
            else{
                //判断角色和人家的距离是否在合适位置,移动或攻击
                findAndDeci(p);
                //施放技能
                res=judgeInstance(p,CLOSE_INSTANCE);
                if(1==t||0==t){
                    if(res){
                        releRealativeSkill(p);
                    }
                }
            }
        }
        else{
            //积分在高级区
            if(1==t||3==t||6==t){
                if(moveRight==getRelativePos(ai,p)){//角色在右边，向左走
                    if(1==t)
                        ai->setStatus(defenseRight);
                    ai->setStatus(moveLeft);
                }
                else if(moveLeft==getRelativePos(ai,p)){//角色在右边，向左走
                    if(1==t)
                        ai->setStatus(defenseLeft);
                    ai->setStatus(moveRight);
                }
            }
            else{
                //判断角色和人家的距离是否在合适位置,移动或攻击
                findAndDeci(p);
                //施放技能
                res=judgeInstance(p,CLOSE_INSTANCE);
                if(2==t||0==t){
                    if(res){
                        releRealativeSkill(p);
                    }
                }
            }
        }
    }
}
